#include "work1.h"
#include <stdio.h>
// 创建顺序表的函数--通过返回值实现
list_t *create_list_1(){
    // 分配空间
    list_t *p = (list_t *)malloc(sizeof(list_t));
    if(NULL == p){
        printf("内存分配失败\n");
        return NULL;
    }
    // 初始化分配的空间 (count置0)
    p->count = 0;
    return p;
}

// 创建顺序表的函数--通过地址传参实现
int create_list_2(list_t **p){
    if(NULL == p){
        printf("入参为NULL,请检查\n");
        return -1;
    }
    // 分配空间
    *p = (list_t *)malloc(sizeof(list_t));
    if(NULL == *p){
        printf("内存分配失败\n");
        return -1;
    }
    // 初始化分配的空间 (count置0)
    (*p)->count = 0;
    return 0;
}

// 向顺序表插入元素 (尾插)
int insert_list_by_tail(list_t *p, int value){
    if(NULL == p){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    if(N == p->count){
        printf("表已满,插入失败\n");
        return -1;
    }
    p->data[p->count].num = value;
    p->count++;
    return 0;
}

// 打印顺序表中的所有元素
int print_list(list_t *p){
    if(NULL == p){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    int i = 0;
    for(i = 0; i < p->count; i++){
        printf("%d  ", p->data[i].num);
    }
    printf("\n");
    return 0;
}

// 向顺序表插入元素 (任意位置插入)
int insert_list_by_position(list_t *p, int position, int value){
    if(NULL == p){
        printf("入参为NULL,请检查\n");
        return -1;
    }
    if(N == p->count){
        printf("表已满,插入失败\n");
        return -1;
    }
    if(position < 0 || position > p->count){
        printf("位置不合理,插入失败\n");
        return -1;
    }
    int i = 0;
    for(i = p->count-1; i >= position; i--){
        p->data[i+1] = p->data[i];
    }
    p->data[position].num = value;
    p->count++;
    return 0;
}

// 删除顺序表中的元素(尾删)
int delete_list_by_tail(list_t *p){
    if(NULL == p){
        printf("入参为NULL,请检查\n");
        return -1;
    }
    if(0 == p->count){
        printf("表为空,删除失败\n");
        return -1;
    }
    p->count--;
    return 0;
}

// 删除顺序表中的元素(任意位置删)
int delete_list_by_position(list_t *p, int position){
    if(position < 0 || position >= p->count){
        printf("位置错误\n");
        return -1;
    }
    int i;
    for(i = position;i<p->count-1;i++){
        p->data[i] = p->data[i+1];
    }
    p->count--;
    return 0;
}
// 修改指定位置的元素
int modify_list_by_position(list_t *p, int position, int new_value){
    if(NULL == p){
        printf("入参为NULL,请检查\n");
        return -1;
    }
    if(position < 0 || position >= p->count){
        printf("位置不合理,修改失败\n");
        return -1;
    }
    p->data[position].num = new_value;
    return 0;
}

// 查找指定位置的元素
int search_list_by_position(list_t *p, int position, int *buff){
    // 入参合法性检查
    if(NULL == p || NULL == buff){
        printf("入参为NULL,请检查\n");
        return -1;
    }
    if(position < 0 || position >= p->count){
        printf("指定的位置没有数据,查找失败\n");
        return -1;
    }
    *buff = p->data[position].num;
    return 0;
}

// 清空顺序表
int clean_list(list_t *p){
    if(NULL == p){
        printf("入参为NULL,请检查\n");
        return -1;
    }
    p->count = 0;
    return 0;
}
/*
// 销毁顺序表
int destroy_list(list_t **p){
    if(NULL == p || NULL == *p){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    free(*p);
    *p = NULL;
    return 0;
}
*/
// 顺序表排序 --flag用来控制升序和降序  传0 升序 传1 降序
int sort_list(list_t *p, int flag){
    if(NULL == p || 1 == p->count){
        printf("无法排序\n");
        return -1;
    }
    //降序
        if(flag == 0){
            for(int i=0;i<p->count-1;i++){
            for(int j =0;j < p->count-1-i;j++){
            
        if(p->data[j].num>p->data[j+1].num){
                int tmp;
                tmp = p->data[j].num;
                p->data[j].num = p->data[j+1].num;
                p->data[j+1].num = tmp;
            }
           }
        }
    }
    //升序
        if(flag == 1){
            for(int i=0;i<p->count-1;i++){
            for(int j =0;j < p->count-1-i;j++){
           
            if(p->data[j].num<p->data[j+1].num){
                int tmp;
                tmp = p->data[j].num;
                p->data[j].num = p->data[j+1].num;
                p->data[j+1].num = tmp;
           }
        }
    }

}
}
// 顺序表剔重
int tichong_list(list_t *p){
    if(NULL == p || p->count == 1){
        printf("输出错误\n");
        return -1;
    }
    int j =0;
    int k =0;
    for(int i =0;i<p->count-1;i++){
        for(j =i+1;j<p->count;){
            if(p->data[i].num == p->data[j].num){
           for( k = j+1;k<p->count;k++){
                p->data[k-1] = p->data[k];
           }
            p->count--;   
         }else{
             j++;
       }
      }
    }
    return 0;
}
